home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 2 / ETO Development Tools 2.iso / Tools - Objects / MacApp / MacApp CD Release / MacApp 2.0.1 (Many Libraries) / Libraries / UAssociation.inc1.p < prev    next >
Encoding:
Text File  |  1990-10-25  |  7.9 KB  |  351 lines  |  [TEXT/MPS ]

  1. {$P}
  2. {[a-,body+,h-,o=100,r+,rec+,t=4,u+,#+,j=20/57/1$,n-]}
  3. {UAssociation.inc1.p}
  4. {Copyright © 1988-1990 by Apple Computer Inc.  All rights reserved.}
  5.  
  6. {--------------------------------------------------------------------------------------------------}
  7. {$S MAAssociationRes}
  8.  
  9. PROCEDURE TEntry.IEntry(itsKey, itsValue: Str255);
  10.  
  11.     VAR
  12.         fi:                 FailInfo;
  13.  
  14.     PROCEDURE HdlIEntry(error: OSErr;
  15.                         message: LONGINT);
  16.  
  17.         BEGIN
  18.         Free;
  19.         END;
  20.  
  21.     BEGIN
  22.     IObject;
  23.  
  24.     fKey := NIL;
  25.     fValue := NIL;
  26.     CatchFailures(fi, HdlIEntry);
  27.  
  28.     fKey := NewString(itsKey);
  29.     FailNIL(fKey);
  30.  
  31.     fValue := NewString(itsValue);
  32.     FailNIL(fValue);
  33.  
  34.     Success(fi);
  35.     END;
  36.  
  37. {--------------------------------------------------------------------------------------------------}
  38. {$S MAAssociationRes}
  39.  
  40. PROCEDURE TEntry.Free; OVERRIDE;
  41.  
  42.     BEGIN
  43.     Handle(fKey) := DisposeIfHandle(fKey);
  44.     Handle(fValue) := DisposeIfHandle(fValue);
  45.  
  46.     INHERITED Free;
  47.     END;
  48.  
  49. {--------------------------------------------------------------------------------------------------}
  50. {$S MAAssociationRes}
  51.  
  52. PROCEDURE TEntry.SetValue(VAR value: Str255);
  53.  
  54.     BEGIN
  55.     SetString(fValue, value);
  56.     IF fValue^^ <> value THEN
  57.         BEGIN
  58.         FailOSErr(memFullErr);                            { SetString may attempt to increase the
  59.                                                          handle size, yet it does not return
  60.                                                          errors! }
  61.         END;
  62.     END;
  63.  
  64. {--------------------------------------------------------------------------------------------------}
  65. {$S MAFields}
  66.  
  67. PROCEDURE TEntry.Fields(PROCEDURE DoToField(fieldName: Str255;
  68.                                             fieldAddr: Ptr;
  69.                                             fieldType: INTEGER)); OVERRIDE;
  70.  
  71.     BEGIN
  72.     DoToField('TEntry', NIL, bClass);
  73.     DoToField('fKey', @fKey, bStringHandle);
  74.     DoToField('fValue', @fValue, bStringHandle);
  75.     INHERITED Fields(DoToField);
  76.     END;
  77.  
  78. {--------------------------------------------------------------------------------------------------}
  79. {$S MAAssociationRes}
  80.  
  81. FUNCTION TEntriesList.Compare(item1, item2: TObject): INTEGER;
  82.  
  83.     BEGIN
  84.     IF TEntry(item1).fKey^^ < TEntry(item2).fKey^^ THEN
  85.         Compare := kItem1LessThanItem2
  86.     ELSE IF TEntry(item1).fKey^^ > TEntry(item2).fKey^^ THEN
  87.         Compare := kItem1GreaterThanItem2
  88.     ELSE
  89.         Compare := kItem1EqualItem2;
  90.     END;
  91.  
  92. {--------------------------------------------------------------------------------------------------}
  93. {$S MAAssociationRes}
  94.  
  95. PROCEDURE TEntriesList.IEntriesList;
  96.  
  97.     BEGIN
  98.     ISortedList;
  99.     END;
  100.  
  101. {--------------------------------------------------------------------------------------------------}
  102. {$S MAFields}
  103.  
  104. PROCEDURE TEntriesList.Fields(PROCEDURE DoToField(fieldName: Str255;
  105.                                                   fieldAddr: Ptr;
  106.                                                   fieldType: INTEGER)); OVERRIDE;
  107.  
  108.     BEGIN
  109.     DoToField('TEntriesList', NIL, bClass);
  110.     INHERITED Fields(DoToField);
  111.     END;
  112.  
  113. {--------------------------------------------------------------------------------------------------}
  114. {$S MAAssociationRes}
  115.  
  116. PROCEDURE TAssociation.IAssociation;
  117.  
  118.     VAR
  119.         anEntriesList:        TEntriesList;
  120.         fi:                 FailInfo;
  121.  
  122.     PROCEDURE HdlIAssociation(error: OSErr;
  123.                               message: LONGINT);
  124.  
  125.         BEGIN
  126.         Free;
  127.         END;
  128.  
  129.     BEGIN
  130.     IObject;
  131.  
  132.     fEntries := NIL;                                    { So Free will work on failure }
  133.     CatchFailures(fi, HdlIAssociation);
  134.  
  135.     New(anEntriesList);
  136.     FailNIL(anEntriesList);
  137.     anEntriesList.IEntriesList;
  138.     fEntries := anEntriesList;
  139.     {$IFC qDebug}
  140.     fEntries.SetEltType('TEntry');
  141.     {$ENDC}
  142.  
  143.     Success(fi);
  144.     END;
  145.  
  146. {--------------------------------------------------------------------------------------------------}
  147. {$S MAAssociationRes}
  148.  
  149. PROCEDURE TAssociation.Free; OVERRIDE;
  150.  
  151.     BEGIN
  152.     fEntries := TEntriesList(FreeListIfObject(fEntries));
  153.  
  154.     INHERITED Free;
  155.     END;
  156.  
  157. {--------------------------------------------------------------------------------------------------}
  158. {$S MAAssociationRes}
  159.  
  160. PROCEDURE TAssociation.EachEntryDo(PROCEDURE DoToEntry(theEntry: TEntry));
  161.  
  162.     BEGIN
  163.     fEntries.Each(DoToEntry);
  164.     END;
  165.  
  166. {--------------------------------------------------------------------------------------------------}
  167. {$S MAAssociationRes}
  168.  
  169. FUNCTION TAssociation.EntryWithKey(keyStr: Str255): TEntry;
  170.  
  171.     FUNCTION TestKey(theEntry: TObject): INTEGER;
  172.  
  173.         BEGIN
  174.         IF keyStr < TEntry(theEntry).fKey^^ THEN
  175.             TestKey := kItemGreaterThanCriteria
  176.         ELSE IF keyStr > TEntry(theEntry).fKey^^ THEN
  177.             TestKey := kItemLessThanCriteria
  178.         ELSE
  179.             TestKey := kItemEqualCriteria;
  180.         END;
  181.  
  182.     BEGIN
  183.     EntryWithKey := TEntry(fEntries.Search(TestKey));
  184.     END;
  185.  
  186. {--------------------------------------------------------------------------------------------------}
  187. {$S MAAssociationRes}
  188.  
  189. FUNCTION TAssociation.EntryWithValue(valueStr: Str255): TEntry;
  190.  
  191.     FUNCTION MatchesValue(theEntry: TEntry): BOOLEAN;
  192.  
  193.         BEGIN
  194.         MatchesValue := valueStr = theEntry.fValue^^;
  195.         END;
  196.  
  197.     BEGIN
  198.     EntryWithValue := FirstEntryThat(MatchesValue);
  199.     END;
  200.  
  201. {--------------------------------------------------------------------------------------------------}
  202. {$S MAAssociationRes}
  203.  
  204. FUNCTION TAssociation.FirstEntryThat(FUNCTION TestEntry(theEntry: TEntry): BOOLEAN): TEntry;
  205.  
  206.     BEGIN
  207.     FirstEntryThat := TEntry(fEntries.FirstThat(TestEntry));
  208.     END;
  209.  
  210. {--------------------------------------------------------------------------------------------------}
  211. {$S MAAssociationRes}
  212.  
  213. PROCEDURE TAssociation.InsertEntry(keyStr, valueStr: Str255);
  214.  
  215.     VAR
  216.         anEntry:            TEntry;
  217.  
  218.     BEGIN
  219.     anEntry := EntryWithKey(keyStr);
  220.     IF anEntry <> NIL THEN
  221.         anEntry.SetValue(valueStr)
  222.     ELSE
  223.         BEGIN
  224.         New(anEntry);
  225.         FailNIL(anEntry);
  226.         anEntry.IEntry(keyStr, valueStr);
  227.         fEntries.Insert(anEntry);
  228.         END;
  229.     END;
  230.  
  231. {--------------------------------------------------------------------------------------------------}
  232. {$S MAAssociationRes}
  233.  
  234. FUNCTION TAssociation.KeyAt(valueStr: Str255;
  235.                             VAR keyStr: Str255): BOOLEAN;
  236.  
  237.     VAR
  238.         theEntry:            TEntry;
  239.  
  240.     FUNCTION MatchesValue(theEntry: TEntry): BOOLEAN;
  241.  
  242.         BEGIN
  243.         MatchesValue := valueStr = theEntry.fValue^^;
  244.         END;
  245.  
  246.     BEGIN
  247.     theEntry := FirstEntryThat(MatchesValue);
  248.     IF theEntry = NIL THEN
  249.         BEGIN
  250.         keyStr := '';
  251.         KeyAt := FALSE;
  252.         END
  253.     ELSE
  254.         BEGIN
  255.         keyStr := theEntry.fKey^^;
  256.         KeyAt := TRUE;
  257.         END;
  258.     END;
  259.  
  260. {--------------------------------------------------------------------------------------------------}
  261. {$S MAAssociationRes}
  262.  
  263. PROCEDURE TAssociation.RemoveValueAt(keyStr: Str255);
  264.  
  265.     VAR
  266.         theEntry:            TEntry;
  267.  
  268.     FUNCTION TestKey(anItem: TObject): INTEGER;
  269.  
  270.         BEGIN
  271.         IF keyStr < TEntry(anItem).fKey^^ THEN
  272.             TestKey := kItemGreaterThanCriteria
  273.         ELSE IF keyStr > TEntry(anItem).fKey^^ THEN
  274.             TestKey := kItemLessThanCriteria
  275.         ELSE
  276.             TestKey := kItemEqualCriteria;
  277.         END;
  278.  
  279.     BEGIN
  280.     theEntry := TEntry(fEntries.Search(TestKey));
  281.     IF theEntry <> NIL THEN
  282.         fEntries.Delete(theEntry);
  283.     END;
  284.  
  285. {--------------------------------------------------------------------------------------------------}
  286. {$S MAAssociationRes}
  287.  
  288. PROCEDURE TAssociation.RemoveKeyAt(valueStr: Str255);
  289.  
  290.     VAR
  291.         theEntry:            TEntry;
  292.  
  293.     FUNCTION MatchesValue(theEntry: TEntry): BOOLEAN;
  294.  
  295.         BEGIN
  296.         MatchesValue := valueStr = theEntry.fValue^^;
  297.         END;
  298.  
  299.     BEGIN
  300.     theEntry := FirstEntryThat(MatchesValue);
  301.     IF theEntry <> NIL THEN
  302.         fEntries.Delete(theEntry);
  303.     END;
  304.  
  305. {--------------------------------------------------------------------------------------------------}
  306. {$S MAAssociationRes}
  307.  
  308. FUNCTION TAssociation.ValueAt(keyStr: Str255;
  309.                               VAR valueStr: Str255): BOOLEAN;
  310.  
  311.     VAR
  312.         theEntry:            TEntry;
  313.  
  314.     FUNCTION CompareKey(theEntry: TObject): INTEGER;
  315.  
  316.         BEGIN
  317.         IF keyStr < TEntry(theEntry).fKey^^ THEN
  318.             CompareKey := kItemGreaterThanCriteria
  319.         ELSE IF keyStr > TEntry(theEntry).fKey^^ THEN
  320.             CompareKey := kItemLessThanCriteria
  321.         ELSE
  322.             CompareKey := kItemEqualCriteria;
  323.         END;
  324.  
  325.     BEGIN
  326.     theEntry := TEntry(fEntries.Search(CompareKey));
  327.     IF theEntry = NIL THEN
  328.         BEGIN
  329.         valueStr := '';
  330.         ValueAt := FALSE;
  331.         END
  332.     ELSE
  333.         BEGIN
  334.         valueStr := theEntry.fValue^^;
  335.         ValueAt := TRUE;
  336.         END;
  337.     END;
  338.  
  339. {--------------------------------------------------------------------------------------------------}
  340. {$S MAFields}
  341.  
  342. PROCEDURE TAssociation.Fields(PROCEDURE DoToField(fieldName: Str255;
  343.                                                   fieldAddr: Ptr;
  344.                                                   fieldType: INTEGER)); OVERRIDE;
  345.  
  346.     BEGIN
  347.     DoToField('TAssociation', NIL, bClass);
  348.     DoToField('fEntries', @fEntries, bObject);
  349.     INHERITED Fields(DoToField);
  350.     END;
  351.